"""
Python中 函数参数的写法主要有四种：
    1. 位置参数
    2. 关键字参数
    3. 默认参数(缺省参数)
    4. 不定长参数


细节：
    1. 位置参数 和 关键字 参数 是针对于 实参 来讲的
    2. 缺省参数 和 不定长参数 是针对 形参  来讲的

不定长参数
    概述：
        不定长参数 也叫 可变参数， 即，参数的个数是可以变化的
    应用场景：
        适用于，实参格式不切定的情况，可以将形参定义成可变参数
    格式：
        *args : 只能接收所有的位置参数，封装到元组中
        **kwargs : 只能接收所有的关键字参数，封装 字典 中
    细节：
        1. 关于实参： 位置参数放在前面，关键字参数放在后面
        2. 关于形参，如果两种可变参数都有，则 :*args在前 **kwargs灾后
        3. 关于形参，如果既有 缺省参数，又有不定长参数，则参数顺序为 *args 缺省参数 **kwargs

"""

# 需求一： 演示不定长参数 接收 位置参数
def func1(*args):
    print(f'接收到的所有参数为:{args}') # 这里我们可以把args当做元组来使用

# 需求三： 演示不定长参数 接收 关键字参数
def func2(**kwargs):
    print(f'接收到的所有参数为:{kwargs}') # 可以把kwargs当做字典来使用
    print(type(kwargs))

# 需求三：演示不定参数 接收 位置参数 和关键字参数
def func3(*args,**kwargs):
    print(f'args:{args}')
    print(f'kwargs:{kwargs}')

# 需求四：演示不定参数 接收 位置参数 和关键字参数 和 缺省参数
def func4(*args,age=18,**kwargs):
    print(f'args:{args}')
    print(f'age:{age}')
    print(f'kwargs:{kwargs}')


if __name__ == '__main__':
    # func1()
    # func1('聂茹凤')
    # func1('聂茹凤',18,'北京市西城区')
    # func1('聂茹凤',18,'北京市西城区',gender='女') 报错 *args只能接收位置参数，不能接收关键字参数

    # func2(name='谭鑫宇')
    # func2(name='谭鑫宇',age=22,address='北京市东城区',gender='女')
    # func2('聂茹凤') ** kwargs 只能接收关键字参数，不能接收位置参数

    # func3('聂茹凤','女',age=18,address='北京市西城区')
    # func3('聂茹凤', age=18, '北京市西城区')  报错， 关键字参数必须在最后


    func4('韩耀祖',address='河北省邯郸市')